iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 14
0

在處理請求的時候,並非每次都能正確處理完請求,
有可能因為某些原因連不到資料庫,或是程式寫錯導致出現bug,
更或者是使用者帶進來的參數錯誤,導致處理上出現錯誤,
在這種情況下,就必須回應錯誤訊息給請求端,不然對方可能會不知道發生什麼事。

錯誤訊息

當程式遇到錯誤時,服務會需要提供錯誤訊息,讓使用者知道發生什麼事,
通常格式會跟正常回應不同,以防止使用者將其當成正常回應去處理。

func handler(w http.ResponseWriter, r *http.Request) {
  w.Write([]byte("error, take user fail"))
}

但是這種方式會讓使用者必須寫一堆判斷式,去判斷這個回應到底是不是正確的,
這時最好有個標的讓使用者判定是否為錯誤,因此會建議回傳以json格式回傳。

func handler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json;charset=UTF-8")
    json.NewEncoder(w).Encode(struct {
	    Error interface{} `json:"error"`
	}{data})
	return

這樣當使用者發現有"error"這個key,就代表這次回來的是錯誤訊息。

HTTP狀態碼(HTTP Status Code)

HTTP Status Code,用來表明一個HTTP請求是否完成的代碼,基本分為以下五類:

  1. 訊息回應(Informational responses, 100~199)
  2. 成功回應(Successful responses, 200~299)
  3. 重新導向(Redirection, 300~399)
  4. 客戶端錯誤(Client errors, 400~499)
  5. 伺服器端錯誤(Server errors, 500~599)

一般正常回應的情況下,會回傳200(OK)代表成功,
而伺服器出現錯誤時,例如資料庫連不上,則是回應500(Internal Server Error),
代表伺服器出現未知或無法處理的錯誤,
常常聽到的404(not found)也是一種HTTP Status Code,
代表找不到請求的資源,其他相關的HTTP Status Code就麻煩再自行看RFC 7231內的規範。
那麼這個狀態碼要如何寫到回應內呢,方法也很簡單:

w.WriteHeader(httpStatus)

這樣就可以把狀態碼寫入回應內了。

restresp

對於認為要把狀態碼跟錯誤訊息json整合起來感到麻煩的人,這邊介紹一個好用的套件。
restresp
使用起來非常容易,這邊用官方範例示範:

type customError struct {
	Code int    `json:"code"`
	Msg  string `json:"msg"`
}

func (c *customError) Error() string {
	return c.Msg
}

func testHandler(w http.ResponseWriter, r *http.Request) {

	d := &customError{5, "wtf"}
	restresp.Write(w, d, 200)
}

將要回傳的資料放入後,他會依照狀態碼判斷是否加上"error"或是"success"的key,
並自動轉成json格式,讓你不用寫判斷式去分辨是否為錯誤。


上一篇
Day13-回應
下一篇
Day15-資料庫
系列文
從0開始的golang web server30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言